﻿////////////////////////////////////////////////////////////////////////////////
//
// LHead3d.h  
//
////////////////////////////////////////////////////////////////////////////////
#ifndef __LHEAD3D_H
#define __LHEAD3D_H

interface IDocument3D;
interface IModelLibrary;
interface IEntity;
interface IRequestInfo;
struct    ksAttribute; 
struct    ksAttributeW; 
interface IAttribute3D;
interface IObjectsFilter3D;
interface IPart;

// Функции обратной связи для фильтрации объектов
typedef BOOL(__stdcall * USERSELECTFILTERPROC)( IEntity* );
// Функции обратной связи процесса
typedef int(__stdcall * USERSELECTCALLBACKPROC)( IEntity*, IRequestInfo* );
// Функции обратной связи объектов созданных в тейк процессе
typedef BOOL(__stdcall * USERTAKEOBJECTCALLBACKPROC)( IUnknown * );
// Функции обратной связи объектов созданных в тейк процессе
typedef BOOL(__stdcall * USERPROCESSINGGROUPOBJECTS)( VARIANT * Objects, long selectionType );

// Примитивы -------------------------------------------------------------------
DEFINE_GUID(IID_IPlaneDefaultXOYDefinition,       0x7AA0E540L, 0x0324, 0x11D4, 0xA3, 0x0E, 0x00, 0xC0, 0x26, 0xEE, 0x09, 0x4F);
DEFINE_GUID(IID_IPlaneDefaultXOZDefinition,       0x7AA0E540L, 0x0325, 0x11D4, 0xA3, 0x0E, 0x00, 0xC0, 0x26, 0xEE, 0x09, 0x4F);
DEFINE_GUID(IID_IPlaneDefaultYOZDefinition,       0x7AA0E540L, 0x0326, 0x11D4, 0xA3, 0x0E, 0x00, 0xC0, 0x26, 0xEE, 0x09, 0x4F);
DEFINE_GUID(IID_IDefaultCSDefinition,             0x7AA0E540L, 0x0327, 0x11D4, 0xA3, 0x0E, 0x00, 0xC0, 0x26, 0xEE, 0x09, 0x4F);

// Операции --------------------------------------------------------------------
DEFINE_GUID(IID_IHoleDefinition,                  0x7AA0E540L, 0x0383, 0x11D4, 0xA3, 0x0E, 0x00, 0xC0, 0x26, 0xEE, 0x09, 0x4F);


#define LIB_FUNC WINAPI
extern "C"
{
// Экспортный номер - 2   kAPI3D5.dll
//-----------------------------------------------------------------------------
// Возвращает указатель на объект - 3d документа
//---
IDocument3D* LIB_FUNC  ksGet3dDocument();

// Экспортный номер - 3   kAPI3D5.dll
//------------------------------------------------------------------------------
// Получить указатель на активный 3d документ
// возвращает NULL, если активного документа нет
// ---
IDocument3D* LIB_FUNC ksGetActive3dDocument();

// Экспортный номер - 4   kAPI3D5.dll
//------------------------------------------------------------------------------
// Получить интерфейс на 3d документ, соответствующий присланному указателю
// возвращает NULL, если документа нет
// Если doc == 0, проверяем текущий документ 3D 
// ---
IDocument3D* LIB_FUNC ksGet3dDocumentFromReference( long doc );

// Экспортный номер - 5   kAPI3D5.dll
//------------------------------------------------------------------------------
// Получить указатель на 3d документ, соответствующий присланному интерфейсу
// возвращает NULL, если документа нет
// doc - интерфейс 3D документа
// ---
long LIB_FUNC ksGetReferenceFrom3dDocument( IDocument3D * doc );

// Экспортный номер - 8   kAPI3D5.dll
//------------------------------------------------------------------------------
// Получить указатель на интерфейс библиотекаря моделей
// ---
IModelLibrary* LIB_FUNC ksGetModelLibrary();

// Экспортный номер - 10   kAPI3D5.dll
//-----------------------------------------------------------------------------
//  создать  атрибут по номеру типа атрибута из  библиотеки libname
//  если libname = NULL- тип атрибута берется в документе
//  функция возвращает указатель на атрибут  или 0 при неудаче
//  pObj - может быть :
//       NULL или LPDOCUMENT3D - атрибут у документа
//       LPFEATURECOLLECTION   - атрибут групповой 
//       LPFEATURE             - атрибут у определенного объекта
//       Атрибут можно добавить ко всем объектам дерева построений, кроме компонентов, сопряжений, группы сопряжений.
//
// ---
IAttribute3D* LIB_FUNC ksCreateAttr3D( LPUNKNOWN pObj,    // указатель объекта к которому подключается атрибут
                                     ksAttribute * attr,// информация об атрибуте
                                     double attrID,     // уникальный номер типа
                                     char *libname );   // имя библиотеки типов атрибутов

// Экспортный номер - 11   kAPI3D5.dll
//------------------------------------------------------------------------------
//  удалить атрибут
//  функция возвращает 1 в случае успеха или 0 при неудаче
// ---
int LIB_FUNC ksDeleteAttr3D( LPUNKNOWN pObj,       //  указатель объекта к которому подключен атрибут
                             IAttribute3D * pAttr,  //  указатель  атрибута
                             char * password );    //  пароль атрибута

// Экспортный номер - 17   kAPI3D5.dll
//------------------------------------------------------------------------------
//  удалить атрибут
//  функция возвращает 1 в случае успеха или 0 при неудаче
//  (Unicode)
// ---
int LIB_FUNC ksDeleteAttr3DW( LPUNKNOWN pObj,       //  указатель объекта к которому подключен атрибут
                              IAttribute3D * pAttr,  //  указатель  атрибута
                              LPWSTR password );    //  пароль атрибута

#ifdef _UNICODE
#define ksDeleteAttr3DT  ksDeleteAttr3DW
#else
#define ksDeleteAttr3DT  ksDeleteAttr3D
#endif // !UNICODE


// Экспортный номер - 12   kAPI3D5.dll
//------------------------------------------------------------------------------
//  Выводится диалог для просмотра атрибутов объекта и выбора нужного атрибута.
//  Функция возвращает  указатель на атрибут в случае успеха или 0 при неудаче.
// ---
IAttribute3D * LIB_FUNC ksChoiceAttr3D ( LPUNKNOWN  pObj ); // указатель объекта к которому подключены атрибуты

// Экспортный номер - 13   kAPI3D5.dll
//------------------------------------------------------------------------------
//  Получить интерфейс фильтрации объектов 3D.
// ---
IObjectsFilter3D * LIB_FUNC ksGetObjectsFilter3D();


// Экспортный номер - 14   kAPI3D5.dll
//-----------------------------------------------------------------------------
//  создать  атрибут по номеру типа атрибута из  библиотеки libname
//  если libname = NULL- тип атрибута берется в документе
//  функция возвращает указатель на атрибут  или 0 при неудаче
//  pObj - может быть :
//       NULL или LPDOCUMENT3D - атрибут у документа
//       LPFEATURECOLLECTION   - атрибут групповой 
//       LPFEATURE             - атрибут у определенного объекта
//       Атрибут можно добавить ко всем объектам дерева построений, кроме компонентов, сопряжений, группы сопряжений.
//
// sourcePart - может быть:
//       NULL или pTop_Part    - атрибут будет создан в текущем документе
//       ! = NULL              - деталь или подсборка вставленная в сборку - атрибут будет создан в документе-источнике 
// ---
IAttribute3D* LIB_FUNC ksCreateAttr3DEx( LPUNKNOWN     pObj,      // указатель объекта к которому подключается атрибут
                                         IPart       * sorcePart, // вствавка - источник
                                         ksAttribute * attr,      // информация об атрибуте
                                         double        attrID,    // уникальный номер типа
                                         char        * libname ); // имя библиотеки типов атрибутов

// Экспортный номер - 17   kAPI3D5.dll
//-----------------------------------------------------------------------------
//  создать  атрибут по номеру типа атрибута из  библиотеки libname
//  если libname = NULL- тип атрибута берется в документе
//  функция возвращает указатель на атрибут  или 0 при неудаче
//  pObj - может быть :
//       NULL или LPDOCUMENT3D - атрибут у документа
//       LPFEATURECOLLECTION   - атрибут групповой 
//       LPFEATURE             - атрибут у определенного объекта
//       Атрибут можно добавить ко всем объектам дерева построений, кроме компонентов, сопряжений, группы сопряжений.
//
// sourcePart - может быть:
//       NULL или pTop_Part    - атрибут будет создан в текущем документе
//       ! = NULL              - деталь или подсборка вставленная в сборку - атрибут будет создан в документе-источнике 
// (Unicode)
// ---
IAttribute3D* LIB_FUNC ksCreateAttr3DExW( LPUNKNOWN     pObj,      // указатель объекта к которому подключается атрибут
                                          IPart       * sorcePart, // вствавка - источник
                                          ksAttributeW * attr,      // информация об атрибуте
                                          double        attrID,    // уникальный номер типа
                                          LPWSTR        libname ); // имя библиотеки типов атрибутов

#ifdef _UNICODE
#define ksCreateAttr3DExT  ksCreateAttr3DExW
#else
#define ksCreateAttr3DExT  ksCreateAttr3DEx
#endif // !UNICODE

//-----------------------------------------------------------------------------
// Выключить проверку валидности у 3D объектов 
// возвращает TRUE, если флаг изменен
// off - true, выкдючить false включить
// doc - интерфейс 3D документа
// Если doc == NULL, проверяем текущий документ 3D 
// ---
BOOL LIB_FUNC ksCheckObjectsValidOffFrom3dDocument( IDocument3D* doc, BOOL off );

// Экспортный номер - 23 kAPI3D5.dll
//-----------------------------------------------------------------------------
/**
Создание не ассоциативной проекции модели на указанную плоскость.

При успехе возвращается указатель на временную группу спроецированных объектов или 0 в случае неудачи.

Входные параметры:
  projPlacement         - размещение проекции
  srcDoc3DPathname      - имя исходного файла - документ модели для проецирования
  targetDoc2D           - 2D документ, в котором должна быть проекция 
  markEmbodyment        - обозначение исполнения
  elemProjFlags         - флаги проецирования
  projLinesDrawFlags    - проецировать невидимые кривые, линий перехода, линий сгиба 
  visibleLinesStyle     - стиль для видимых кривых
  hiddenLinesStyle      - стиль для невидимых кривых
  transitionLinesStyle  - стиль линий перехода
  bendLinesStyle        - стиль линий сгиба

projPlacement - массив SAFEARRAY
  VT_ARRAY | VT_R8 - тип возвращаемого параметра : массив байтов
  4 * 4 - границы массива

Флаги elemProjFlags:
 0x000001  - проецировать сборку в разнесенном виде
 0x000002  - проецировать тела
 0x000004  - проецировать поверхности
 0x000010  - проецировать в развертке
 0x000020  - не проецировать скрытые элементы
 0x000040  - не проецировать стандартные элементов
 0x008000  - проецировать со скрытыми телами
 0x000008  - проецировать обозначения резьбы
 0x000080  - проецировать справочные размеры
 0x000100  - проецировать обозначение шероховатости
 0x000200  - проецировать линию выноски
 0x000400  - проецировать допуск формы
 0x000800  - проецировать обозначение позиции
 0x001000  - проецировать обозначение базы
 0x002000  - проецировать обозначение маркировки
 0x004000  - проецировать обозначение клеймения
 0x010000  - проецировать кривые
 0x020000  - проецировать точки
 0x040000  - учитывать слои
 0x080000  - проецировать эскизы
 0x100000  - проецировать оси

 0x200000  - создавать оси
 0x400000  - создавать круговые сетки центров
 0x800000  - создавать линейные сетки центров
 0x1000000 - создавать обозначения центров


Флаги projLinesDrawFlags:
  0x00001 - проецировать невидимые линии 
  0x00002 - отрисовывать невидимые линии
  0x00004 - отрисовывать линии перехода
  0x00008 - отрисовывать линии сгиба
  0x00010 - отрисовывать осевые линии
  0x00020 - черновое проецирование
*/
//---
long LIB_FUNC ksGetModelProjectionAsDrawingObjects( VARIANT      * projPlacement,
                                                    LPWSTR         srcDoc3DPathname,
                                                    long           targetDoc2D,
                                                    LPWSTR         markEmbodyment,
                                                    unsigned int   elemProjFlags,
                                                    unsigned int   projLinesDrawFlags,
                                                    int            visibleLinesStyle,
                                                    int            hiddenLinesStyle,
                                                    int            transitionLinesStyle,
                                                    int            bendLinesStyle );
}

#endif // __LHEAD3D_H
